package com.learning.code.multithread.keyword.synchronize.method.memberVaribles;

/**
 * 2
 */
public class MainTest {


    /**
     * 由这几个例子，可以看出，synchronized 关键字 取得的锁都是对象锁，即是每个类的具体的实例的锁。而不是类的某个方法或者某个代码片段的锁
     *  调用synchronized 修饰的方法一定是派对运行的
     * @param args
     */
    public static void main(String[] args) {

        //test1();
        //test2();
        test3();

    }

    /**
     *  2. 结论： 成员变量(实例变量)是非线程安全的！
     */
    public static void test1(){
        HasMemberVariablesClass hasMemberVariablesClass = new HasMemberVariablesClass();
        new Thread(() -> {
            hasMemberVariablesClass.changeNumByName("xiaoming");
        }).start();

        new Thread(() -> {
            hasMemberVariablesClass.changeNumByName("dahuang");
        }).start();
      /*    打印 结果：
        xiaoming set over
        others set over
        dahuang'num is 200
        xiaoming'num is 200*/
    }

    /**
     *  3. 结论： 多线程访问同步方法一定是线程安全的
     */
    public static void test2(){
        System.out.println("-----------------------------");
        HasMemberVariablesAndSynchronizedMethod hasMemberVariablesAndSynchronizedMethod = new HasMemberVariablesAndSynchronizedMethod();
        new Thread(() -> {
            hasMemberVariablesAndSynchronizedMethod.changeNumByName("xiaoming2");
        }).start();

        new Thread(() -> {
            hasMemberVariablesAndSynchronizedMethod.changeNumByName("dahuang2");
        }).start();

   /*    打印 结果：
        xiaoming2 set over
        xiaoming2'num is 100
        others2 set over
        dahuang2'num is 200*/


    }
    /**
     *  4. 结论： 多线程访问同一个类的两个不同实例的相同名称的同步方法，是异步执行的
     */
    public static void test3(){
        System.out.println("-----------------------------");
        HasMemberVariablesAndSynchronizedMethod hasMemberVariablesAndSynchronizedMethod = new HasMemberVariablesAndSynchronizedMethod();
        HasMemberVariablesAndSynchronizedMethod hasMemberVariablesAndSynchronizedMethod2 = new HasMemberVariablesAndSynchronizedMethod();
        new Thread(() -> {
            hasMemberVariablesAndSynchronizedMethod.changeNumByName("xiaoming2");
        }).start();

        new Thread(() -> {
            hasMemberVariablesAndSynchronizedMethod2.changeNumByName("dahuang2");
        }).start();

   /*    打印 结果：
       xiaoming2 set over
        others2 set over
        dahuang2'num is 200
        xiaoming2'num is 100*/


    }
    public static void test4(){

    }
}
